package cn.tedu.test.rabbitmq.controller;

import cn.tedu.test.rabbitmq.domain.User;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试了解RabbitTemplate相关api
 */
@RestController
public class SendController {
    //注入 底层自动配置好的对象
    @Autowired
    private RabbitTemplate rabbitTemplate;
    //请求传递了一个name值 把name值当做消息发送
    @GetMapping("/send")
    public String send(String name){
        //如何调用api发送消息 考虑数据序列化问题 底层将信息转化成byte数组 但是没有处理过对象
        //在框架中无需担心,工具方法一斤考虑到了对象的序列化以及反序列化的问题.
        //1.send方法 单向发送的方法,消息需要手动封装,开发者 需要考虑序列化问题
        /**
         * String exchange: 发送目标交换机
         * String routKey: 消息路由key
         * Message message: 发送数据封装对象
         */
        /*Message msg = MessageBuilder.withBody(name.getBytes()).build();
        rabbitTemplate.send("demo-exchange","demo-rk",msg);*/
        //2.convertAndSend 比send多了一个功能 convert 转化,自动帮助你实现序列化只需要关系发送
        //直接将消息体内容 String或者对象交给convertAndSend 底层调用的还是send
        //rabbitTemplate.convertAndSend("demo-exchange","demo-rk",name);
        User user=new User();
        user.setName(name);
        rabbitTemplate.convertAndSend("demo-exchange","demo-rk",user);
        //和数据
        //TODO 3.可以利用回调 确认消息发送的结果 前提是yaml属性支持回调结果获取
        return "OK";
    }
    @GetMapping("/receive")
    public String receive(){
        //Message receive = rabbitTemplate.receive("demo-queue");
        //receive.getBody();
        Object userBody = rabbitTemplate.receiveAndConvert("demo-queue");//发送body
        //userBody有可能拿不到
        if (userBody instanceof User){
            User user = (User) userBody;
            return user.getName();
        }else{
            return "error";
        }
    }

}
